#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>
#include<string.h>
#define NUM 128
#define CMD_NUM 64
int main()
{
  char command[NUM];
  while(1){
      char* argv[CMD_NUM] = {NULL};
      //1.打印提示符
      command[0] = 0;//用这种方式，可以做到O(1)时间复杂度，清空字符串
      printf("[zzy@VM-16-9-centos mydir]$ ");
      fflush(stdout);
      //2.获取命令字符串
      fgets(command,NUM,stdin);
      command[strlen(command)-1] = 0;//"ls\n\0" --> “ls\0”
     // printf("echo: %s\n",command);
      //3.解析命令字符串 char* argv[];
      char*sep = " "; //分隔符
      int i = 0;
      for(argv[i] = strtok(command,sep);argv[i]!=NULL;argv[i]=strtok(NULL,sep))
      {
        ++i;
      }
      // for(i = 0;argv[i];++i)
      // {
      //   printf("argv[%d]:%s\n",i,argv[i]);
      // }
      //4.检测命令是否需要shell本身执行的，内建命令
      if(!strcmp(argv[0],"cd"))
      {
        if(argv[1])
        {
          chdir(argv[1]);
        }
        //一旦内建了就不需要执行后面的代码了，我们继续命令行解析
        continue;
      }
      //5.解析完就替换
      if(!fork())
      {
        //child
        execvp(argv[0],argv);
        //替换失败就终止他，不让他向后跑
        exit(1);
      }
      //father 等待任何一，阻塞等待
      int status = 0;
      waitpid(-1,&status,0);
      printf("exit code: %d\n",(status>>8)&0xff);
  }
  return 0;
}

